package controlador;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;
import java.util.Calendar;

import modelo.Cliente;
import modelo.DetalleOrden;
import modelo.Orden;
import modelo.Producto;
import modelo.facade.Fachada;

import vista.VentanaOrden;


public class ControladorVentanaOrden implements ActionListener {

	private VentanaOrden ventanaOrden;
	private float total=0;
	private Fachada fachada = new Fachada();
	
	public ControladorVentanaOrden() {
		super();
		ventanaOrden = VentanaOrden.getInstancia();
		ventanaOrden.setVisible(true);	
		ventanaOrden.addListener(this);	
		Calendar calendar = Calendar.getInstance();
		String dia = Integer.toString(calendar.get(Calendar.DATE));
		String mes = Integer.toString(calendar.get(Calendar.MONTH)+1);
		String annio = Integer.toString(calendar.get(Calendar.YEAR));
		ventanaOrden.cargarComboCategoria(fachada.llenarComboCategoria());
		String nombrecategoria = ventanaOrden.getComboCategoria();
		ventanaOrden.cargarComboProducto(fachada.llenarComboProducto(nombrecategoria));
		ventanaOrden.setNoOrden("0"+Integer.toString(fachada.generarCodigoOrden()));
		ventanaOrden.setFecha(annio+"-"+mes+"-"+dia);
	}
	
	private void RegistrarOrden(){
		try
		{
		    if(ventanaOrden.getCedula().equals("")|| 
		    		ventanaOrden.getNombre().equals("") || 
		    		ventanaOrden.getTotal().equals(""))
		    	ventanaOrden.mostrarMensaje("Debe llenar todos los datos para poder registrar la Orden");
		    else
		    {
		    	Cliente cliente = new Cliente();
		    	cliente = fachada.getCliente(ventanaOrden.getCedula());
		    	
		    	if(cliente.getCodigocliente().equals("-1")){
		    		cliente = new Cliente(ventanaOrden.getCedula(), ventanaOrden.getNombre(), ventanaOrden.getDireccion(),1);
		    		fachada.registrarCliente(cliente);
		    	}

		    	Orden orden = new Orden(ventanaOrden.getNoOrden(), ventanaOrden.getFecha(), ventanaOrden.getCedula(), Float.parseFloat(ventanaOrden.getTotal()), 1);
		    	fachada.registrarOrden(orden);
		    	
			     int i=ventanaOrden.getDetalleOrden().getRowCount();
			       
			     for(int j=0; j<i;j++)
			     {
			    	DetalleOrden detalleorden = new DetalleOrden(ventanaOrden.getNoOrden(), String.valueOf(ventanaOrden.getDetalleOrden().getValueAt(j, 1)), Integer.parseInt(String.valueOf(ventanaOrden.getDetalleOrden().getValueAt(j, 3))));
			    	fachada.registrarDetalleOrden(detalleorden);
			     }
			        ventanaOrden.mostrarMensaje("La Orden fue registrado con exito");
			    	ventanaOrden.borrarDatos();
		    	}
		    	int nro = Integer.parseInt(ventanaOrden.getNoOrden())+1;
		    	ventanaOrden.setNoOrden("0"+String.valueOf(nro));
			}catch(Exception e)
			{
				ventanaOrden.mostrarMensaje("No se pudo registrar la orden, verifique que los datos sean correctos");
				ventanaOrden.borrarDatos();
			}
		}
	
	private void buscarCliente(){
		if(ventanaOrden.getCedula().equals(""))
			ventanaOrden.mostrarMensaje("Debe indicar el codigo del cliente");
		else{
			Cliente cliente = new Cliente();
		
			cliente = fachada.getCliente(ventanaOrden.getCedula());
		
			if(cliente.getCodigocliente().equals("-1"))
				ventanaOrden.mostrarMensaje("El cliente no se encuentra registrado");
			else{
				ventanaOrden.setNombre(cliente.getNombre());
				ventanaOrden.setDireccion(cliente.getDireccion());
			}
		}
	}
	
	private void incluirProducto(){
		if (ventanaOrden.getCantidadProducto().equals(""))
			ventanaOrden.mostrarMensaje("Debe indicar la cantidad del producto");
		else{
			Producto producto = new Producto();
			String cantidadproducto = ventanaOrden.getCantidadProducto();
			String codigoorden = ventanaOrden.getNoOrden();
			producto = fachada.getProducto(ventanaOrden.getComboProducto());
			if(!(fachada.descontarOrden(producto.getCodigoproducto(), Float.parseFloat(cantidadproducto)))){
				total = total+producto.getPrecio()*Integer.parseInt(cantidadproducto);
				float monto=0;
				monto=producto.getPrecio()*Integer.parseInt(cantidadproducto);
				ventanaOrden.setTotal(String.valueOf(total));
				ventanaOrden.getDetalleOrden().incluir(codigoorden, producto.getCodigoproducto(), producto.getDescripcion(), cantidadproducto, String.valueOf(producto.getPrecio()), String.valueOf(monto));
			}
			else
				fachada.actualizarOrden(producto.getCodigoproducto(), Float.parseFloat(cantidadproducto));
		}
	}
	
	private void removerDetalle(){
		int i=ventanaOrden.getDetalleOrden().getRowCount();
		if(i==0)
			ventanaOrden.mostrarMensaje("No hay elementos para ser removidos");
		else{
			fachada.actualizarOrden(String.valueOf(ventanaOrden.getDetalleOrden().getValueAt(ventanaOrden.seleccionDetalleOrden(), 1)), Float.parseFloat(String.valueOf(ventanaOrden.getDetalleOrden().getValueAt(ventanaOrden.seleccionDetalleOrden(), 3))));
			total-=Float.parseFloat(String.valueOf(ventanaOrden.getDetalleOrden().getValueAt(ventanaOrden.seleccionDetalleOrden(), 4)));
			ventanaOrden.setTotal(String.valueOf(total));
			ventanaOrden.getDetalleOrden().remover(ventanaOrden.seleccionDetalleOrden());	
		}
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		String actionCommand = e.getActionCommand();
		if (e.getSource() == ventanaOrden.getCategoria()) {
		String nombrecategoria = ventanaOrden.getComboCategoria();
		ventanaOrden.cargarComboProducto(fachada.llenarComboProducto(nombrecategoria));
		} else if (actionCommand.equals("Buscar")) {
			buscarCliente();
		}		
		else if (actionCommand.equals("Aceptar")){
			incluirProducto();
		}
		else if (actionCommand.equals("Remover")){
			removerDetalle();
		}
		else if (actionCommand.equals("Guardar")){
			RegistrarOrden();
		}
		else if (actionCommand.equals("Cancelar")) {
			int i=ventanaOrden.getDetalleOrden().getRowCount();
		       
		    for(int j=0; j<i;j++)
		    	fachada.actualizarOrden(String.valueOf(ventanaOrden.getDetalleOrden().getValueAt(j, 1)), Float.parseFloat(String.valueOf(ventanaOrden.getDetalleOrden().getValueAt(j, 3))));
		    ventanaOrden.borrarDatos();
		}
		else if (actionCommand.equals("Salir")){
			int i=ventanaOrden.getDetalleOrden().getRowCount();
			if(i==0)
				this.ventanaOrden.setVisible(false);
			else{
				for(int j=0; j<i;j++)
			    	fachada.actualizarOrden(String.valueOf(ventanaOrden.getDetalleOrden().getValueAt(j, 1)), Float.parseFloat(String.valueOf(ventanaOrden.getDetalleOrden().getValueAt(j, 3))));
				this.ventanaOrden.setVisible(false);
			}
		}
	}

}